阅读更多

0顶
0踩

移动开发

原创新闻 如何在Swift中使用LLVM API?

2015-12-07 16:36 by 副主编 mengyidan1988 评论(0) 有6150人浏览
从Swift中使用LLVM是件很美妙的事情。它给了我们一个非常好的机会—在Swift中借助LLVM来编写语言。本文主要演示如何在Swift中使用LLVM。

本文主要内容是演示如何在Swift中使用LLVM,其包含了如下四个要点:

获取最新版本的LLVM
使用CMake和llvm-config编译程序
编写简单的Swift程序,编译并与LLVM进行连接
在内存中编写简单的sum函数并使用LLVM编译器来执行
LLVM的准备

要获取最新版本的LLVM,可以通过中央的SVN repository或官方git镜像进行获取。我建议使用后者,因为速度更快。

对于本文的实例,我会把所有相关文件存放在主目录下的一个目录中:



LLVM使用CMake来生成程序。编译程序前我们在LLVM目录的同个级别下创建一个独立的目录,并生成编译规定:



CMake可以生成不同的输出:makefiles, Xcode羡慕, VisualStudio方案等等。如果没有指定别的生成系统,CMake将使用默认的GNU/Make生成系统。

模块化是LLVM的重要优点之一,它里面含有很多“小型”库,部分库会用在本文的示例程序中。如果你是一个LLVM新手,我建议可以借助llm-config工具来进行学习。

可用如下方式来运行llvm-config:



注意:-j4表示开启多核环境,同时运行4个作业llvm-config的可用选项还包括了,库路径定位,头文件路径定位,连接标记匹配等等。

也不妨直接使用无选项llvm-config来看看它的运行结果如何。

编译器也是很重要的,我们来看看如何运行它:



Hello LLVM
上述的准备工作做好后,便可以进行程序编写了。



如果要检查整个编译环境,可以尝试创建一个空模块然后释放它:



此外,编译该示例程序还需要向编译器传入标识符,以便指定具体的SDK,指定连接标识,设置头部文件搜索路径等。



事实上,指定正确的连接标识和库路径是很简单的,这得益于llvm-config:



至于头部文件和额外参数的实现则更有技巧。正常情况下,在clang中,我们会使用llvm-config - -cflags,注意这方式是不能用在swift编译器中的。让我们检视下- -clfags:



其输出包含了几个参数,我们可以忽略全部的参数除了头部文件搜索路径(-I …)以及宏定义(-D_...)。问题是swift 编译器不能像clang那样处理宏定义,尽管我们可以使用-Xcc选项来绕过它以clang驱动方式进行:



如果直接运行它,我们将会看到错误警示:连接器会反馈说不能从ncurses和STD C++库里找到符号。不用担心,正确的写法应该是:



现在我们执行程序了:



这看起来未免有点枯燥,但我们有了新的发现:我们可以从Swift里调用LLVM C API!

接下来尝试创建简单的sum加法函数,它对两个输入参数进行现加并返回结果。以下是等价的C程序:



要创建一个函数,我们需要指定所有用到的类型:返回值类型和参数类型。

多个参数的类型必须以数组方式传递。C API在这方面是强项:



生成它:



执行:



原型就绪后,接着就是函数主体的编写。

代码原子是基本区块。函数和循环体,条件分支(if/else,switch/case等)这些都是基本的区块。我们的函数里也有类似的区块:



该区块可以使用builder来完成。第一步是获得对函数参数的访问;第二步是使用temp变量来存储结果。最后一步是return语句。



把该代码放置在sumFunction声明的后面,但是要在LLVMDumpModule之前。完整的示例代码请在文章末端进行查阅。

编译并运行,你将看到如下的函数体:



最后也是最有趣的环节来了—如何运行这些代码?

LLVM C API 提供了一些执行引擎:如MCJIT以及Interpreter,我们使用的是后者。

下面让我们创建一个执行引擎:



最后,让我们执行整个加法运算。这里我们使用与函数类型类似的技巧—使用UnsafeMutablePointer来进行API指向。请记得在最后进行相关的内存销毁。



运算结果应该是:



完整的代码示例:






小结

从Swift中使用LLVM是件很美妙的事情。它给了我们一个非常好的机会—在Swift中借助LLVM来编写语言。C API虽然有一定限制,但是以这为起点也绰绰有余了。

英文出自:lowlevelbits
  • 大小: 17 KB
  • 大小: 19.7 KB
  • 大小: 9.3 KB
  • 大小: 19.7 KB
  • 大小: 21.3 KB
  • 大小: 35.5 KB
  • 大小: 12.4 KB
  • 大小: 13.1 KB
  • 大小: 20.3 KB
  • 大小: 13.1 KB
  • 大小: 13.2 KB
  • 大小: 14.2 KB
  • 大小: 16.3 KB
  • 大小: 116.6 KB
  • 大小: 13.2 KB
  • 大小: 17.3 KB
  • 大小: 11.7 KB
  • 大小: 42.3 KB
  • 大小: 32.5 KB
  • 大小: 62.6 KB
  • 大小: 77.8 KB
  • 大小: 38.1 KB
  • 大小: 191 KB
  • 大小: 86.3 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • LLVMSwift:LLVM C API(版本9.0.1)的Swift包装器

    LLVMSwift:LLVM C API(版本9.0.1)的Swift包装器

  • LLVM C API(版本8.0.1)的Swift包装器-Swift开发

    LLVMSwift LLVMSwift是LLVM API及其关联库的纯Swift接口。 它提供了易于使用的本机组件,使编译器开发变得有趣。 简介LLVM IR根uni LLVMSwift LLVMSwift是LLVM API及其关联库的纯Swift接口。 它提供了易于使用的本机...

  • 什么是LLVM? Swift,Rust,Clang等背后的力量

    新语言以及对现有语言的改进在整个开发环境中如雨后春笋般冒出。 Mozilla的Rust , 苹果的Swift , Jetbrains的Kotlin以及许多其他语言为开发人员提供了速度,安全性,便利性,便携性和功能性方面的新选择。 为...

  • LLVM C API Swift Wrapper.zip

    LLVM C API Swift Wrapper.zip,llvm c api的swift包装(版本8.0.1)

  • llvm clang_什么是LLVM? Swift,Rust,Clang等的强大功能

    llvm clang 新语言以及对现有语言的改进在整个开发环境中如雨后春笋般冒出。 Mozilla的Rust , 苹果的Swift , Jetbrains的Kotlin以及许多其他语言为开发人员提供了速度,安全性,便利性,便携性和功能性方面的新...

  • Swift中使用C API时传递指针注意事项

    Swift总的来说是一门比较容易编写的静态编译且略带一些动态特性的编程语言。由于Swift在2014年才刚诞生,因此当前在语法上修改的幅度比较大,尤其...我们在Swift中可以使用大量C语言形式的系统API,这些API中有不少包含

  • Swift 中的热重载

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VHJV1HA9-1657855879470)(https这一年是2040年...但是如果您和我一样,在特别的一天中,对代码库进行200-500次迭代,该怎么办呢?它增加了。...

  • [转帖]什么是 LLVM?Swift, Rust, Clang 等语言背后的支持

    要了解用于以编程方式生成机器原生代码的编译器框架...https://www.oschina.net/translate/what-is-llvm-the-power-behind-swift-rust-clang-and-more?print debian 好像也在进行 RISC-V 的迁移 但是因为LLVM...

  • 什么是 LLVM?Swift, Rust, Clang 等语言背后的原力

    Mozilla 的 Rust、Apple 的 Swift、Jetbrains 的 Kotlin,以及许多其它的语言都给开发者在速度、安全性、便利性、可移植性还有能力这些方面提供了新的选择。为什么现在正当时呢?一个大因素就是那些用来构建语言的新...

  • 在Swift中使用CocoaPods

    从CocoaPods的从介绍来看,它是主要给Objective-C项目用的,但是我们可以很容易地混合Objective-C和Swift到同个项目,从而利用大量的CocoaPods库和Swift漂亮舒服的语法。 “” 阅读器 ...

  • LLVM 新一代 JIT API:ORC

    最近看到 ORC(On Request Compilation) 在增加 MachO 平台的 OC 和 Swift 语言支持,这是 MachO JIT(Just In Time) 相关的进展。本文将探索这个 LLVM 新一代的 JIT APIs,即 ORC,其 ORC JIT Weekly 现在还一直处于...

  • 在 Swift 中使用 CocoaPods

    本文介绍如何在 Swift 项目中使用 CocoaPods 。如果你已经精通 Bridging Header 的方法,请直接跳到 “扩展 CocoaPods” 一节。 什么是 CocoaPods CocoaPods is the dependency manager for Objective-C ...

  • LLVM系列(1)- LLVM简介

    LLVM最初以C/C++为实现对象,目前已支持包括ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java字节码、Objective-C、Swift、Python、Ruby、Crystal、Rust、Scala以及C#等语言。............

  • c语言中break可以用在swift,Swift 和 C 不得不说的故事

    原标题:Swift 和 C 不得不说的...在不同平台下混合使用 Swift 和 C 的可行性,看起来是一件非常难的实践,只有非常有限的实践资源,当然这是和你去封装一个原生库对比起来看的,你可以在你代码运行的平台上轻松地封...

  • Swift中的类与结构体

    结构体除了属性的存储更安全、效率更高之外,其函数的派发也更高效。由于结构体不能被继承,内部函数属于静态派发,在编译期就确定了函数的执行地址,减少了函数的寻址过程以及内存地址的偏移计算,更加高效。

  • 逐步实现基于源码的 Swift 代码覆盖率

    在这篇短文中,我将会给你介绍:如何生成 *.profraw 文件并通过命令行测量代码覆盖率如何在 Swift App 项目里调用 C/C++ 方法如何在 Xcode 中测量完整 Swift App 项目的代码覆盖率在我们测量完整 App 项目的代码覆盖...

  • Use CocoaPods With Swift (在 Swift 中使用 CocoaPods)

    http://andelf.github.io/blog/2014/06/23/use-cocoapods-with-swift/ ...声明: 转载注明我或者 SwiftChina 。请在方便的情况下情尽量告知....本文介绍如何在 Swift 项目中使用 CocoaPods

  • 从Swift桥接文件到Clang-LLVM

    前言今天在Swift工程中不小心创建了一个OC文件,于是乎提示我创建一个桥接文件,那么为什么需要创建桥接文件呢,它的原理又是什么呢?打开百度一搜,全是教你怎么创建桥接文件的,似乎找不到答案~LVVM - Low Level ...

  • 如何评价 Apple 为 iOS 8 推出的 Metal 图形 API?

    参考 ...Apple的軟硬件平台本身不開放,無須使用Android所需的OpenGL ES標準。...而且,在游戏主机中所使用的CPU和GPU都是经过细致的定制,与零售版相近型号也有所不同。即便是针对某一特定型号,优化的意义也...

  • 安装NumPy教程-详细版

    附件是安装NumPy教程_详细版,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

Global site tag (gtag.js) - Google Analytics